// ****************************************************************
// Test-Stimuli f"ur Speicherkopier-Schaltung
// ****************************************************************

`timescale 1ns / 10ps

// Schnittstelle f"ur Standardtestrahmen
module stimulus (
                 // Schnittstellensignale PPC Master <-> PLB On-Chip-Bus
                 PLBC405DCUADDRACK,
                 PLBC405DCUBUSY,
                 PLBC405DCUERR,
                 PLBC405DCURDDACK,
                 PLBC405DCURDDBUS,
                 PLBC405DCURDWDADDR,
                 PLBC405DCUSSIZE1,
                 PLBC405DCUWRDACK,
                 PLBC405ICUADDRACK,
                 PLBC405ICUBUSY,
                 PLBC405ICUERR,
                 PLBC405ICURDDACK,
                 PLBC405ICURDDBUS,
                 PLBC405ICURDWDADDR,
                 PLBC405ICUSSIZE1,
                 PLBCLK,
                 C405PLBDCUABORT,
                 C405PLBDCUABUS,
                 C405PLBDCUBE,
                 C405PLBDCUCACHEABLE,
                 C405PLBDCUGUARDED,
                 C405PLBDCUPRIORITY,
                 C405PLBDCUREQUEST,
                 C405PLBDCURNW,
                 C405PLBDCUSIZE2,
                 C405PLBDCUU0ATTR,
                 C405PLBDCUWRDBUS,
                 C405PLBDCUWRITETHRU,
                 C405PLBICUABORT,
                 C405PLBICUABUS,
                 C405PLBICUCACHEABLE,
                 C405PLBICUPRIORITY,
                 C405PLBICUREQUEST,
                 C405PLBICUSIZE,
                 C405PLBICUU0ATTR,
                 EICC405EXTINPUTIRQ
                );

// Bibliothek von Hilfsfunktionen lesen
`include "plbutils.v"

  // Hier beginnt der eigentliche Test
  initial begin : test

    // Hilfsvariable als Ziel fuer Leseoperationen
    reg [31:0] data;

    // Initialisiere Simulationsumgebung
    Startup;

    // Eingabedaten aus Datei lesen
    ReadMemFile("input.mem");
    
    // Fuehre einen systemweiten Reset durch
    SystemReset;

    // Starte Aufzeichnung der Signalzustaende
    StartRecordingSignals;

    // Lese ein 32b Wort von der Adresse 40
    // Da dort kein Register liegt, sollte
    // die Magic Number 0x00COFFEE zurueckkommen
    Read32(`SLAVE_BASE + 32'h28, data);
    $display("Magic %h\n", data);

    // Startadresse 4 in Register 0 schreiben
    Write32(`SLAVE_BASE + 32'h0, 32'h00000004);

    // Zieladresse 4096 in Register 1 schreiben
    Write32(`SLAVE_BASE + 32'h4, 32'h00001000);

    // Datensatzlaenge 48 in Register 2 schreiben
    Write32(`SLAVE_BASE + 32'h8, 32'h00000002);
    
    // RC starten durch Schreiben auf Register 3
    Write32(`SLAVE_BASE + 32'hc, 32'h00000001);

    // Warte, bis RC durch IRQ das Ende anzeigt
    RunUntilInterrupt;

    // Ausgabedaten in Datei schreiben
    WriteMemFile("output.mem", 32'h00001000, 32'h0000002);
    
    // Fahre Simulationsumgebung wieder herunter
    Shutdown;
  end

endmodule
